package cn.ryh.mybatisplus.generator;

import com.baomidou.mybatisplus.generator.FastAutoGenerator;
import com.baomidou.mybatisplus.generator.config.ConstVal;
import com.baomidou.mybatisplus.generator.config.OutputFile;
import com.baomidou.mybatisplus.generator.config.po.LikeTable;
import com.baomidou.mybatisplus.generator.config.rules.DateType;
import com.baomidou.mybatisplus.generator.engine.FreemarkerTemplateEngine;

import java.util.Collections;

/**
 * @author Rao
 * @Description
 * @create 2022-03-25 13:59
 */
public class MyMbatisPlusGenerator {
    /**
     * 当前项目路径
     */
    public static String path = System.getProperty("user.dir") +"/src/main/java";
    public static void main(String[] args) {
        create();
    }

    /**
     * 快速生成
     */
    public static void create() {
        FastAutoGenerator.create("jdbc:mysql://localhost:3306/ryh_test?serverTimezone=GMT%2B8&characterEncoding=utf-8",
                        "root", "XXXXXXX")
                //全局配置
                .globalConfig(builder -> {
                    // 设置作者 默认值:作者
                    builder.author("Raoyh")
                            // 覆盖已生成文件,默认值:false
                            // .fileOverride()
                            // 禁止打开输出目录	默认值:true
                            .disableOpenDir()
                            // 指定输出目录 默认值: windows:D://  linux or mac : /tmp
                            .outputDir(path)
                            // 开启 kotlin 模式	默认值:false
                            //.enableKotlin()
                            // 开启 swagger 模式  默认值:false
                            // .enableSwagger()
                            //时间策略	DateType.ONLY_DATE 默认值: DateType.TIME_PACK
                            .dateType(DateType.TIME_PACK)
                            // 注释日期	默认值: yyyy-MM-dd
                            .commentDate("yyyy-MM-dd");
                })
                //包配置
                .packageConfig(builder -> {
                    // 设置父包名 默认值:com.baomidou
                    builder.parent("cn.ryh")
                            // 设置业务模块名 默认值:无
                            .moduleName("generator")
                            // Entity 包名 默认值:entity
                            .entity("entity")
                            // Service 包名 默认值:service
                            .service("service")
                            // Service Impl 包名 默认值:service.impl
                            .serviceImpl("service.impl")
                            // Mapper 包名 	Mapper 包名	默认值:mapper
                            .mapper("mapper")
                            // Mapper XML 包名	默认值:mapper.xml
                            .xml("mapper.xml")
                            // Controller 包名	默认值:controller
                            .controller("controller");
                    // 自定义文件包名	输出自定义文件时所用到的包名
                    //.other(String)
                    //路径配置信息	Collections.singletonMap(OutputFile.mapperXml, "D://")
                    // .pathInfo(Collections.singletonMap(OutputFile.mapper, "D://"));
                })
                //模板配置
                .templateConfig(builder -> {
                    //  设置实体模板路径(JAVA)	/templates/entity.java
                    builder.entity("/templates/entity.java")
                            // 设置实体模板路径(kotlin)	/templates/entity.java
                            .entityKt("/templates/entity.java")
                            // 设置 service 模板路径	/templates/service.java
                            .service("/templates/service.java")
                            // 设置 serviceImpl 模板路径	/templates/serviceImpl.java
                            .serviceImpl("/templates/serviceImpl.java")
                            // 设置 mapper 模板路径	/templates/mapper.java
                            .mapper("/templates/mapper.java")
                            // 设置 mapperXml 模板路径	/templates/mapper.xml
                            .xml("/templates/mapper.xml")
                            // 设置 controller 模板路径	/templates/controller.java
                            .controller("/templates/controller.java");
                    // //禁用所有模板
                    // .disable()
                    // //禁用模板
                    // .disable(TemplateType.ENTITY);
                })
                //  注入配置
                // .injectionConfig(builder -> {
                //     //  输出文件之前消费者
                //     builder.beforeOutputFile((tableInfo, objectMap) -> {
                //                 System.out.println("tableInfo: " + tableInfo.getEntityName() + " objectMap: " + objectMap.size());
                //             })
                //             //  自定义配置 Map 对象
                //             .customMap(Collections.singletonMap("test", "baomidou"))
                //             // 自定义配置模板文件
                //             .customFile(Collections.singletonMap("test.txt", "/templates/test.vm"))
                // })
                // 策略配置
                .strategyConfig(builder -> {
                    // 开启大写命名	默认值:false
                    builder.enableCapitalMode()
                            // 开启跳过视图	默认值:false
                            .enableSkipView()
                            // 禁用 sql 过滤	默认值:true，语法不能支持使用 sql 过滤表的话，可以考虑关闭此开关
                            .disableSqlFilter()
                            // 启用 schema	默认值:false，多 schema 场景的时候打开
                            .enableSchema()
                            //  模糊表匹配(sql 过滤)	likeTable 与 notLikeTable 只能配置一项
                            // .likeTable(new LikeTable("hibernate_sequence"))
                            // 模糊表排除(sql 过滤)	likeTable 与 notLikeTable 只能配置一项
                            .notLikeTable(new LikeTable("hibernate_sequence"))
                            // 设置需要生成的表名 增加表匹配(内存过滤)	include 与 exclude 只能配置一项
                            .addInclude("payment")
                    // 增加表排除匹配(内存过滤)	include 与 exclude 只能配置一项
                    // .addExclude("hibernate_sequence")
                    //设置过滤表前缀 增加过滤表前缀
                    // .addTablePrefix("T_")
                    //增加过滤表后缀
                    // .addTableSuffix()
                    //增加过滤字段前缀
                    // .addFieldPrefix()
                    //增加过滤字段后缀
                    // .addFieldSuffix()
                    //实体策略配置
                    // .entityBuilder()
                    //controller 策略配置
                    // .controllerBuilder()
                    //mapper 策略配置
                    // .mapperBuilder()
                    //service 策略配置
                    .serviceBuilder().convertServiceFileName(entityName -> entityName + ConstVal.SERVICE);
                })
                // 使用Freemarker引擎模板，默认的是Velocity引擎模板
                .templateEngine(new FreemarkerTemplateEngine())
                .execute();

    }

    /**
     * 交互式生成
     */
    public static void mutualCreate() {
        FastAutoGenerator.create("url", "username", "password")
                .globalConfig(builder -> {
                    builder.author("baomidou") // 设置作者
                            .enableSwagger() // 开启 swagger 模式
                            .outputDir("D://"); // 指定输出目录
                })
                .packageConfig(builder -> {
                    builder.parent("com.baomidou.mybatisplus.samples.generator") // 设置父包名
                            .moduleName("system") // 设置父包模块名
                            .pathInfo(Collections.singletonMap(OutputFile.xml, "D://")); // 设置mapperXml生成路径
                })
                .strategyConfig(builder -> {
                    builder.addInclude("t_simple") // 设置需要生成的表名
                            .addTablePrefix("t_", "c_"); // 设置过滤表前缀
                })
                // .templateEngine(new FreemarkerTemplateEngine()) // 使用Freemarker引擎模板，默认的是Velocity引擎模板
                .execute();

    }
}
